<?php
namespace App\Controller\App;

use App\Query\UserPayQuery;
use App\Repository\UserPayRepository;

use App\Facade\Pay;

class UserPayController extends Controller
{
    // 日志 
    public function index()
    {
        return $this->user()->paginate(15)->toArray();
    }
    
    // 我的支付
    public function user()
    {
        return UserPayQuery::user($this->auth());
    }
    
    // 创建订单
    public function create()
    {
        $user = $this->auth();
        $level = $this->level();
        
        // 金额
        $money = (float) $this->input('money');
        
        // 优惠
        $discount = (float) $this->input('discount');
        
        // 补贴
        $full = (float) $this->input('full');
        
        // 判断是否有未成功的订单
        if($count = UserPayQuery::statusPost(UserPayQuery::user($user))->count())
        {
            $this->error('pay_status');
        }
        
        // 充值封顶
        if(!$user->moneyPayHas($money))
        {
            $this->error('money_pay');
        }
        
        // 优惠比例使用
        if(!$level->discountMake($money, $discount))
        {
            $this->error('money_discount_make');
        }
        
        // 补贴比例使用
        if(!$level->fullPay($money, $full))
        {
            $this->error('money_full_pay');
        }
        
        // 优惠使用比例
        if($discount > 0)
        {
            // 检查优惠
            if(!$user->moneyDiscountHas($discount))
            {
                $this->error('money_discount');
            }
        }
        
        // 补贴使用比例
        if($full > 0)
        {
            // 检查补贴
            if(!$user->moneyFullHas($full))
            {
                $this->error('money_full');
            }
        }
        
        // 扣除
        $user->moneyDiscountMake($discount, '在线充值使用');
        $user->moneyFullMake($full, '在线充值使用');
        
        // 创建订单
        if(UserPayRepository::make()->create($user, compact('money', 'discount', 'full')))
        {
            $this->message('create');
        }
        
        $this->error('create');
    }
    
    // 开始支付 
    public function pay($id)
    {
        if(!$order = $this->user()->find($id))
        {
            $this->error('error');
        }
        
        $order = UserPayRepository::make($order);
        
        // 状态
        if(!$order->is())
        {
            $this->error('pay_error');
        }
        
        // 加载支付
        if(!$pay = Pay::run(strtolower($this->input('type'))))
        {
            $this->error('pay_type');
        }

        $response = $pay->setMoney($order->pay())
                        ->setNotify(dirname($this->request->url()) . '/notify/' . $id)
                        ->send();

        if($response->error())
        {
            $this->error($response->message());
        }
        
        return $response->data();
    }
    
    // 关闭
    public function no($id)
    {
        if(!$order = $this->user()->find($id))
        {
            $this->error('error');
        }
        
        $order = UserPayRepository::make($order);
        
        // 状态
        if(!$order->is())
        {
            $this->error('pay_error');
        }
        
        if($order->setStatusNo())
        {
            $this->message('ok');
        }
        
        $this->error('error');
    }
    
    // 回调充值
    public function notify($id)
    {
        // 订单
        if(!$order = UserPayRepository::find($id))
        {
            $this->error('error');
        }
        
        // 状态
        if(!$order->is())
        {
            $this->error('pay_error');
        }
        
        // 调试使用
        if($this->input('password') == 999999)
        {
            $order->setStatusOk('test');
            $this->message('ok');
        }
        
        // 回调
        $notify = Pay::notify($this->request->all());
        
        // 不能出错
        if($notify->error())
        {
            return;
        }
        
        // 充值成功
        $order->setStatusOk($notify->getOrderId());
        
        return $notify->response();
    }
}
